const isJSON = require('koa-is-json');
const zlib = require('zlib');


/*
  使用中间件
  中间件编写完成后, 我们还需要手动挂载, 支持以下方式:
    - 在应用中使用中间件
      在应用中, 可以通过配置来加载自定义的中间件, 并决定它们的顺序. (config.default.js)
      ```js 
        middleware: ['gzip'];
        gizp: {
          // 中间件配置
        }
      ```
    - 在路由中使用中间件
        // app.router.js
        module.exports = ap => {
          const gzip = app.middleware.gizp({threshold: 1024});
          app.router.get("/needgzip", gzip, app.controller.handler)
        }
*/
module.exports = (options, app) => {
  return async function gzip(ctx, next) {
    // console.log('gzip==options===========', options, app)
    console.log('gzip==options===========', options)
    await next();
  
    // 后续中间件执行完成后将相应体转换成gzip
    let body = ctx.body;
    if(!body) return;

    if(options.threshold && ctx.length < options.threshold) return;

    if(isJSON(body)) body = JSON.stringify(body);
  
    // 设置gizp body, 修正响应头
    const stream = zlib.createGzip();
    stream.end(body);
    ctx.body = stream;
    ctx.set('Content-Endcoing', 'gzip');
    console.log('gzip==compress===========')
  }
}
